package tools.utils {
	/**
	 * 数学计算工具类
	 * @author ase7en
	 * @date 2010-10-8
	 */
	public class CountUtil {
		/**
		 * 小数加法
		*/
		public static function dcmAdd(arg1:Number, arg2:Number):* {
			var r1:Number,r2:Number,m:Number;
			try {
				r1 = arg1.toString().split(".")[1].length;
			} catch(e:Error) {
				r1 = 0;
			}
			try {
				r2 = arg2.toString().split(".")[1].length;
			} catch(e:Error) {
				r2 = 0;
			}
			m = Math.pow(10, Math.max(r1, r2));
			var n:Number = (r1 >= r2) ? r1 : r2;
			// （不加这个还是有问题，如68.04+16.17，因为在下面的arg1*m时会出现浮点数，
			// 当然也可以用dcmMul(arg1,m)来解决，但考虑到效率还是加这个吧。）
			return ((arg1 * m + arg2 * m) / m).toFixed(n);
		}
		
		/**
		 * 小数减法
		*/
		public static function dcmSbt(arg1:Number, arg2:Number):*{
			var r1:Number,r2:Number,m:Number,n:Number;
			try {
				r1 = arg1.toString().split(".")[1].length;
			} catch(e:Error) {
				r1 = 0;
			}
			try {
				r2 = arg2.toString().split(".")[1].length;
			} catch(e:Error) {
				r2 = 0;
			}
			m = Math.pow(10, Math.max(r1, r2));
			n = (r1 >= r2) ? r1 : r2;
			// （不加这个还是有问题，如68.04-16.17）
			return ((arg1 * m - arg2 * m) / m).toFixed(n);
		}
		/**
		 * 小数乘法
		*/
		public static function dcmMul(arg1:Number, arg2:Number):*{
			var m:Number = 0,s1:String = arg1.toString(),s2:String = arg2.toString();
			try {
				m += s1.split(".")[1].length;
			} catch(e:Error) {
			}
			try {
				m += s2.split(".")[1].length;
			} catch(e:Error) {
			}
			return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
		}
		
		/**
		 * 小数除法
		* @param arg1 被除数
		* @param arg2 除数
		*/
		public static function dcmDiv(arg1:Number, arg2:Number):*{
			var t1:Number = 0,t2:Number = 0,r1:Number,r2:Number;
			try {
				t1 = arg1.toString().split(".")[1].length;
			} catch(e:Error) {
			}
			try {
				t2 = arg2.toString().split(".")[1].length;
			} catch(e:Error) {
			}
			r1 = Number(arg1.toString().replace(".", ""));
			r2 = Number(arg2.toString().replace(".", ""));
			return dcmMul((r1 / r2), Math.pow(10, t2 - t1));
		}

		/**
		 * 最大公约数
		* @param m 第一个数
		* @param n 第二个数
		*/
		public static function gongyue(m : int, n : int):int {
			if(m % n == 0) {
				return n;
			} else {
				return gongyue(n, m % n);
			}
		}

		/**
		 * 最小公倍数
		* @param m 第一个数
		* @param n 第二个数
		*/
		public static function gongbei(m : int, n : int):int {
			var gongyueshu : int = gongyue(m, n);
			return (m * n) / gongyueshu;
		}
		
		/**
		 * 是否除尽，保留除尽的位数
		* @param m 被除数
		* @param n 除数
		* @param len 保留余数的位数
		*/
		public static function endDiv(m : Number, n : Number, len : int):Boolean {
			var boo : Boolean;
			var indexM : int = String(m).indexOf(".");
			var indexN : int = String(n).indexOf(".");
			var lenM : int = String(m).length - indexM - 1;
			var lenN : int = String(n).length - indexN - 1;
			var num : int = (lenM > lenN) ? (lenM) : (lenN);
			var end : Number = m * Math.pow(10, num) / (n * Math.pow(10, num));
			if(end * Math.pow(10, len) == int(end * Math.pow(10, len))) {
				if(String(end).length < 4) {
					boo = true;
				}
			}
			return boo;
		}
		
		/**
		 * 正弦
		*/
		public static function sin(angel:Number):Number{
			return Math.sin(angel * Math.PI / 180);
		}
		
		/**
		 * 余弦
		*/
		public static function cos(angel:Number):Number{
			return Math.cos(angel * Math.PI / 180);
		}
		
		/**
		 * 度转弧度
		*/
		public static function degreesToRadians(angel:Number):Number{
			return angel * Math.PI / 180;
		}
		/**
		 * 弧度转度
		*/
		public static function RadiansTodegrees(angel:Number):Number{
			return angel * 180 / Math.PI;
		}
		
		/**
		 * 两点间距离
		*/
		public static function distance(x1:Number,y1:Number,x2:Number,y2:Number):Number{
			var dx:Number = x2 - x1;
			var dy:Number = y2 - y1;
			var d:Number = Math.sqrt(dx * dx + dy * dy);
			return d;
		}
		
		/**
		 * 角度值返回其正切值
		*/
		public static function tan(angel:Number):Number{
			return Math.tan(angel * Math.PI / 180);
		}
		/**
		 * 正切值返回其角度值
		*/
		public static function atan(rad:Number):Number{
			return Math.atan(rad) * 180 / Math.PI;
		}
		/**
		 * 反正切
		*/
		public static function atan2(x:Number,y:Number):Number{
			return Math.atan2(y,x) * 180 / Math.PI;
		}
		/**
		 * 两点间角度
		*/
		public static function angle(x1:Number,y1:Number,x2:Number,y2:Number):Number{
			return atan2(y2 - y1,x2 - x1);
		}
		/**
		 * 反正弦
		*/
		public static function asin(ratio:Number):Number{
			return Math.round(Math.asin(ratio) * 180 / Math.PI);
		}
		/**
		 * 反余弦
		*/
		public static function acos(ratio:Number):Number{
			return Math.round(Math.acos(ratio) * 180 / Math.PI);
		}
	}
}
